#!/usr/bin/python
#-*-coding: utf-8 -*- 
""" Script qui affiche les évolutions du taux d'apprentissage et du rayon de voisinage dans le SOM implémenté 
Roxane Levy """
import pylab
import numpy

total_iterations = 1500
map_x = 30 ; 
map_y = 25 ; 



""" Ci-dessous les fonctions pour la décroissance du taux d'apprentissage"""
def myfunc0(x) :    # décroissance linéaire,type 0
	initial_alpha = 1.0
	return initial_alpha - (x/total_iterations)



def myfunc1(x) :     # inverse temps, type 1
	C = total_iterations / 100
	return C / (C + x)


def myfunc2(x) :     # type 2
	alpha = (1.0 * (1.0 - x/1000.0))
	for i in range(0, len(alpha)) :
		if (alpha[i] <= 0) : alpha[i] = 0.01
	return alpha



def myfunc3(x) :    # autre décroissance linéaire, type 3
	initial_alpha = 1.0
	return initial_alpha / (1.0 + x/total_iterations)







""" Ci-dessous les fonctions pour la décroissance du voisinage"""
def neigh0(x) :   # binary form
	initial_sigma = max(map_x,map_y)
	return float(initial_sigma) * (1.0 - x/total_iterations)  


def neigh1(x) :           
	initial_sigma = max(map_x,map_y)
	final_sigma = 1.0
	return initial_sigma * pow(final_sigma/initial_sigma,x/total_iterations)


def neigh2(x) :
	initial_sigma = max(map_x,map_y)
	return initial_sigma * (1.0 - x/total_iterations) + 1



def neigh3(x) :
	initial_sigma = 1.0
	return initial_sigma / (1.0 + x/total_iterations)




x = numpy.linspace(0,total_iterations,100) # 100 linearly spaced numbers
y0 = myfunc0(x) # computing the values of sin(x)/x
y1 = myfunc1(x)
y2 = myfunc2(x)
y3 = myfunc3(x)
n0 = neigh0(x)
n1 = neigh1(x)
n2 = neigh2(x)
n3 = neigh3(x)

# compose plot
pylab.figure(1)
pylab.title("Representation graphique des decroissances du taux d'apprentissage et du rayon de voisinage")
pylab.subplot(211)
pylab.plot(x,y0, 'y',label="RateDecay = 0") 
pylab.plot(x,y1,'b',label="RateDecay = 1")
pylab.plot(x,y2,'purple',label="RateDecay = 2")
pylab.plot(x,y3,'r',label="RateDecay = 3")
pylab.legend()

pylab.subplot(212)
pylab.plot(x,n0, 'g', label="LearningType = 0")
pylab.plot(x,n1, 'r', label="LearningType = 1")
pylab.plot(x,n2, 'orange', label="LearningType = 2")
pylab.plot(x,n3, 'blue', label="LearningType = 3")
pylab.legend()


pylab.show() 
